package com.guli.eduService.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.guli.eduService.entity.EduChapter;
import com.guli.eduService.entity.EduVideo;
import com.guli.eduService.entity.vo.ChapterVO;
import com.guli.eduService.entity.vo.VideoVO;
import com.guli.eduService.mapper.EduChapterMapper;
import com.guli.eduService.service.EduChapterService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guli.serviceBase.Entity.GuliExcepiton;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程 服务实现类
 * </p>
 *
 * @author zxc
 * @since 2023-04-03
 */
@Service
public class EduChapterServiceImpl extends ServiceImpl<EduChapterMapper, EduChapter> implements EduChapterService {

    @Autowired
    private EduVideoServiceImpl eduVideoService;


    // 实现类中，具体实现 接口中所定义的根据课程id，来查询当前课程所有章节信息;
    @Override
    public List<ChapterVO> listChapterData(String courseId) {
        // 封装查询条件 ：课程id == 所传入的课程id
        // 用于查询当前课程所对应的所有章节信息;
        QueryWrapper<EduChapter> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("course_id" , courseId);
        List<EduChapter> chapterList = this.list(queryWrapper1);

        // 封装查询条件 ：课程id == 所传入的课程id
        // 用于查询当前课程所对应的所有小结信息;
        QueryWrapper<EduVideo> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.eq("course_id" , courseId);
        List<EduVideo> videoList = eduVideoService.list(queryWrapper2);

        // 用于存储当前课程的所有章节和小节信息;
        List<ChapterVO> chaptersInfo = new ArrayList<>();
        // 后续将videoList中对应的小节数据，封装到其所对应的chapter中

        // 1.遍历当前课程的所有章节信息
        for (EduChapter eduChapter : chapterList) {
            // （1）创建chapterVO实体类对象
            ChapterVO chapterVO = new ChapterVO();
            // （2）将EduChapter对象转化为chapterVO对象
            BeanUtils.copyProperties(eduChapter , chapterVO);
            // （3）定义list集合，用来存储当前章节下所有小节信息;
            List<VideoVO> children = new ArrayList<>();
            // 2.遍历所获取到的所有小节信息
            for (EduVideo eduVideo : videoList) {
                // 当前正在遍历的小节信息是 属于当前章节chapter的;
                if(chapterVO.getId().equals(eduVideo.getChapterId())){
                    // （1）创建videoVO实体类对象
                    VideoVO videoVO = new VideoVO();
                    // （2）将eduVideo对象转化为VideoVO对象
                    BeanUtils.copyProperties(eduVideo , videoVO);
                    videoVO.setFree(eduVideo.getIsFree() == 1); // 是否免费
                    // （3）符合条件的videoVO对象，加入到对应的chapterVO对象的children集合中;
                    children.add(videoVO);
                }
            }
            // （4）设置chapterVO对象的chilren集合
            chapterVO.setChildren(children);
            chaptersInfo.add(chapterVO);
        }
        return chaptersInfo;
    }

    // 具体实现根据id删除章节信息方法
    @Override
    public boolean deleteChapter(String chapterId) {
        // 注意 ：若是当前章节中仍然存在小节信息的话在，则该章节是不能够被删除的;
        // 1.查询当前章节下的所有小结信息;
        QueryWrapper<EduVideo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("chapter_id" , chapterId);
        List<EduVideo> eduVideoList = eduVideoService.list(queryWrapper);

        // 2.当前章节下的小节信息不为空 ：
        if(!eduVideoList.isEmpty()){
            throw new GuliExcepiton(20005 , "当前章节下，还有剩余小节信息，无法删除！！！");
        }
        // 3.当前章节下的小节信息为空 ：
        boolean flag = this.removeById(chapterId);
        return flag;
    }

    // 具体实现 ：根据课程id，删除指定的章节信息;
    @Override
    public boolean removeByCourseId(String courseId) {
        // 将课程id信息，封装到QueryWrapper对象中;
        QueryWrapper<EduChapter> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("course_id" , courseId);
        boolean flag = this.remove(queryWrapper);
        return flag;
    }
}
